package cn.itcast.web.controller.cargo;


import cn.itcast.domain.cargo.Export;
import cn.itcast.domain.cargo.ExportProduct;
import cn.itcast.domain.cargo.ExportProductExample;
import cn.itcast.domain.system.User;
import cn.itcast.service.cargo.ExportProductService;
import cn.itcast.service.cargo.ExportService;
import cn.itcast.web.controller.BaseController;

import cn.itcast.web.utils.BeanMapUtils;
import com.alibaba.dubbo.config.annotation.Reference;
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;


import javax.servlet.ServletOutputStream;
import javax.sql.DataSource;
import java.io.InputStream;
import java.util.*;


@Controller
@RequestMapping("/cargo/export")
public class PdfController extends BaseController  {

    @RequestMapping("/exportPdf1")
    public void exportPdf(String id) throws Exception {
     //1.读取jasper的文件流
        InputStream in= session.getServletContext().getResourceAsStream("/jasper/test001.jasper");

        //2.创建jasper对象，用来往模板中填充数据
        /*
        参数1：jasper文件流
        参数2：通过map方式往模板里面填充数据，目前为空
        参数3：通过数据源往模板填充数据，目前为空
         */
        JasperPrint jasperPrint=
    JasperFillManager.fillReport(in,new HashMap<>(),new JREmptyDataSource());

        //3.导出pdf
        /*
        1.参数1：JasperPrint对象 （模板+数据）
        2.参数2：response输出流
         */

        JasperExportManager.exportReportToPdfStream(jasperPrint,response.getOutputStream());

        in.close();
    }



    @RequestMapping("/exportPdf2")
    public void exportPdf3(String id) throws Exception {
        //1.读取jasper的文件流
        InputStream in= session.getServletContext().getResourceAsStream("/jasper/test003.jasper");

        //2.创建jasper对象，用来往模板中填充数据
        /*
        参数1：jasper文件流
        参数2：通过map方式往模板里面填充数据，目前为空
        参数3：通过数据源往模板填充数据，目前为空
         */
        //给Map填充数据
        Map<String,Object>map=new HashMap();
        map.put("username","小明");
        map.put("email","ming@export.com");
        map.put("companyName","传智播客");
        map.put("deptName","测试部");

        JasperPrint jasperPrint=
                JasperFillManager.fillReport(in,map,new JREmptyDataSource());

        //3.导出pdf
        /*
        1.参数1：JasperPrint对象 （模板+数据）
        2.参数2：response输出流
         */

        JasperExportManager.exportReportToPdfStream(jasperPrint,response.getOutputStream());

        in.close();
    }



    //jdbc填充数据源
    @Autowired
    private DataSource dataSource ;
    @RequestMapping("/exportPdf3")
    public void exportPdf4(String id) throws Exception {

        //因为是JDBC链接数据库，注入连接池

        //1.读取jasper的文件流
        InputStream in= session.getServletContext().getResourceAsStream("/jasper/test-04jdbc.jasper");

        //2.创建jasper对象，用来往模板中填充数据
        /*
        参数1：jasper文件流
        参数2：通过map方式往模板里面填充数据，目前为空
        参数3：通过数据源往模板填充数据，目前为空
         */



        JasperPrint jasperPrint=
                JasperFillManager.fillReport(in, null, dataSource.getConnection());

        //3.导出pdf
        /*
        1.参数1：JasperPrint对象 （模板+数据）
        2.参数2：response输出流
         */

        JasperExportManager.exportReportToPdfStream(jasperPrint,response.getOutputStream());

        in.close();
    }


//javaBean填充数据
    @RequestMapping("/exportPdf5")
    public void exportPdf5(String id) throws Exception {

        //因为是JDBC链接数据库，注入连接池

        //1.读取jasper的文件流
        InputStream in= session.getServletContext().getResourceAsStream("/jasper/test005.jasper");

        //2.创建jasper对象，用来往模板中填充数据
        /*
        参数1：jasper文件流
        参数2：通过map方式往模板里面填充数据，目前为空
        参数3：通过数据源往模板填充数据，目前为空
         */
        //javaBean二：创建一个list封装数据
        List<User>list=new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            User user=new User();
            user.setEmail("baidu@qq.com");
            user.setUserName("柳岩");
            user.setCompanyName("百度公司");
            user.setDeptName("生活部");
            list.add(user);

        }




        //javaBean一：构建一个数据源对象，用来封装集合数据
        JRDataSource jrDataSource=new JRBeanCollectionDataSource(list);
        JasperPrint jasperPrint=
                JasperFillManager.fillReport(in, null, jrDataSource);

        //3.导出pdf
        /*
        1.参数1：JasperPrint对象 （模板+数据）
        2.参数2：response输出流
         */

        JasperExportManager.exportReportToPdfStream(jasperPrint,response.getOutputStream());

        in.close();
    }




    //javaBean填充数据+分组
    @RequestMapping("/exportPdf6")
    public void exportPdf6(String id) throws Exception {

        //因为是JDBC链接数据库，注入连接池

        //1.读取jasper的文件流
        InputStream in= session.getServletContext().getResourceAsStream("/jasper/test006.jasper");

        //2.创建jasper对象，用来往模板中填充数据
        /*
        参数1：jasper文件流
        参数2：通过map方式往模板里面填充数据，目前为空
        参数3：通过数据源往模板填充数据，目前为空
         */
        //javaBean二：创建一个list封装数据
        List<User>list=new ArrayList<>();
        for (int j = 0; j <= 3; j++) {
            for (int i = 0; i < 5; i++) {
                User user=new User();
                user.setEmail("alibaba@qq.com");
                user.setUserName("和平饭店");
                user.setCompanyName("阿里巴巴"+j);
                user.setDeptName("营销部");
                list.add(user);

            }
        }

        //javaBean一：构建一个数据源对象，用来封装集合数据
        JRDataSource jrDataSource=new JRBeanCollectionDataSource(list);
        JasperPrint jasperPrint=
                JasperFillManager.fillReport(in, null, jrDataSource);

        //3.导出pdf
        /*
        1.参数1：JasperPrint对象 （模板+数据）
        2.参数2：response输出流
         */

        JasperExportManager.exportReportToPdfStream(jasperPrint,response.getOutputStream());

        in.close();
    }



    //javaBean填充数据+分组
    @RequestMapping("/exportPdf7")
    public void exportPdf7(String id) throws Exception {

        //因为是JDBC链接数据库，注入连接池

        //1.读取jasper的文件流
        InputStream in= session.getServletContext().getResourceAsStream("/jasper/test0077.jasper");

        //2.创建jasper对象，用来往模板中填充数据
        /*
        参数1：jasper文件流
        参数2：通过map方式往模板里面填充数据，目前为空
        参数3：通过数据源往模板填充数据，目前为空
         */
        //javaBean二：创建一个list封装数据
        List<Map<String , Object>>list=new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            Map<String ,Object>map=new HashMap<>();
            map.put("title","厂家"+i);
            map.put("value",new Random().nextInt(100));
            list.add(map);
        }
        //javaBean一：构建一个数据源对象，用来封装集合数据
        JRDataSource jrDataSource=new JRBeanCollectionDataSource(list);
        JasperPrint jasperPrint=
                JasperFillManager.fillReport(in, null, jrDataSource);

        //3.导出pdf
        /*
        1.参数1：JasperPrint对象 （模板+数据）
        2.参数2：response输出流
         */

        JasperExportManager.exportReportToPdfStream(jasperPrint,response.getOutputStream());

        in.close();
    }





    @Reference
    private ExportProductService exportProductService;
    @Reference
    private ExportService  exportService;
    //javaBean填充数据//导出pdf
    @RequestMapping("/exportPdf")
    public void exportPdf8(String id) throws Exception {

        //因为是JDBC链接数据库，注入连接池

        //1.读取jasper的文件流
        InputStream in= session.getServletContext().getResourceAsStream("/jasper/export.jasper");

        //2.创建jasper对象，用来往模板中填充数据
        /*
        参数1：jasper文件流
        参数2：通过map方式往模板里面填充数据，目前为空
        参数3：通过数据源往模板填充数据，目前为空
         */
        //1.定义集合，往模板中填充数据，1.map集合，封装报运单信息，模板中对应的是parameter的名称
        //根据报运单id查询报运单对象
        Export export = exportService.findById(id);
        //因为需要的是map，所以需要将对象转为map类型
        Map<String, Object> map = BeanMapUtils.beanToMap(export);

        //2.定义集合，往模块中填充数据，2.list集合，封装商品列表，模板中对应的是field的名称
        //根据报运单id查询商品集合
        ExportProductExample example =new ExportProductExample();
        example.createCriteria().andExportIdEqualTo(id);
        List<ExportProduct> list = exportProductService.findAll(example);


        //javaBean一：构建一个数据源对象，用来封装集合数据
        JRDataSource jrDataSource=new JRBeanCollectionDataSource(list);
        JasperPrint jasperPrint=
                JasperFillManager.fillReport(in, map, jrDataSource);



        //3.导出pdf,并下载
        /*
        1.参数1：JasperPrint对象 （模板+数据）
        2.参数2：response输出流
         */
        response.setCharacterEncoding("UTF-8");
        //设置响应头
        response.setHeader("content-disposition","attachment;fileName=export.pdf");

        //获取response输出流
       // ServletOutputStream out = response.getOutputStream();
        JasperExportManager.exportReportToPdfStream(jasperPrint,response.getOutputStream());

        in.close();
    }

}
